import type { App, Plugin } from "vue";

/**
 * 数组转为字符串
 * @param val
 */
export function castArray2String(val) {
  if (val instanceof Array) {
    return val.join(",");
  } else {
    return val;
  }
}

//生成组key
//唯一key值
export function getKey() {
  let res = "";
  for (let i = 0; i < 32; i++) {
    let n = Math.floor(Math.random() * 16).toString(16);
    res += n;
  }
  return res;
}

export const withInstall = <T>(component: T, alias?: string) => {
  //console.log("---初始化---", component);

  const comp = component as any;
  comp.install = (app: App) => {
    // @ts-ignore
    app.component(comp.name || comp.displayName, component);
    if (alias) {
      app.config.globalProperties[alias] = component;
    }
  };
  return component as T & Plugin;
};

export function getTimeDiff(timestamp) {
  // 将时间戳转换为 Date 对象
  const time = new Date(timestamp);
  const now = new Date();

  // 计算时间差（单位：毫秒）
  // @ts-ignore
  const delta = now - time;

  if (delta < 60000) {
    // 小于1分钟
    return "刚刚";
  } else if (delta < 3600000) {
    // 小于1小时
    const minutes = Math.floor(delta / 60000);
    return `${minutes}分钟前`;
  } else if (delta < 86400000) {
    // 小于1天
    const hours = Math.floor(delta / 3600000);
    return `${hours}小时前`;
  } else if (delta < 2592000000) {
    // 小于30天
    const days = Math.floor(delta / 86400000);
    return `${days}天前`;
  } else {
    // 其他情况，返回具体的日期时间
    return time.toLocaleString(); // 返回具体的日期时间格式
  }
}

//  秒数转化为时分秒
export function formatSeconds(value) {
  //  秒
  let second = parseInt(value);
  //  分
  let minute = 0;
  //  小时
  let hour = 0;
  //  天
  //  let day = 0
  //  如果秒数大于60，将秒数转换成整数
  if (second > 60) {
    //  获取分钟，除以60取整数，得到整数分钟
    minute = parseInt(second / 60);
    //  获取秒数，秒数取佘，得到整数秒数
    second = parseInt(second % 60);
    //  如果分钟大于60，将分钟转换成小时
    if (minute > 60) {
      //  获取小时，获取分钟除以60，得到整数小时
      hour = parseInt(minute / 60);
      //  获取小时后取佘的分，获取分钟除以60取佘的分
      minute = parseInt(minute % 60);
      //  如果小时大于24，将小时转换成天
      //  if (hour > 23) {
      //    //  获取天数，获取小时除以24，得到整天数
      //    day = parseInt(hour / 24)
      //    //  获取天数后取余的小时，获取小时除以24取余的小时
      //    hour = parseInt(hour % 24)
      //  }
    }
  }
  let result: string = "";
  if (second > 0) {
    result = second >= 10 ? parseInt(second) + "" : (0 + "" + parseInt(second));
    if (minute == 0) {
      result = "00:" + result;
    }
  } else {
    result = "00";
  }
  if (minute > 0) {
    result = "" + (minute >= 10 ? parseInt(minute) + "" : (0 + "" + parseInt(minute))) + ":" + result;
  } else {
    result = "00:" + result;
  }
  if (hour > 0) {
    result = "" + (hour >= 10 ? parseInt(hour) + "" : (0 + "" + parseInt(hour))) + ":" + result;
  }
  return result;
}

/**
 * 中英文混合字符串的长度
 * @param str
 */
export function calcStringLength(str) {
  if (!str) {
    return 0;
  }
  return str.match(/[^ -~]/g) == null ? str.length : str.length + str.match(/[^ -~]/g).length;
}

/**
 * 数值转化为百分比
 * @param data
 */
export function toPercent(data) {
  let data1 = (data * 100).toFixed(0) + "%";
  return data1;
}

export function toPercentNoSymbol(data) {
  let data1 = (data * 100).toFixed(0);
  return data1;
}

export function unitPrice(val, unit, location) {
  if (!val) val = 0;
  let price = formatPrice(val);
  if (location === "before") {
    return price.substr(0, price.length - 3);
  }
  if (location === "after") {
    return price.substr(-2);
  }
  return (unit || "") + price;
}

/**
 * 货币格式化
 * @param price
 * @returns {string}
 */
export function formatPrice(price) {
  if (typeof price !== "number") return price;
  return String(Number(price).toFixed(2)).replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
